function arrive()
% Funcion:   arrive
% Proposito: Funcion de los eventos de arribos
%
%
global Q_LIMIT;
global BUSY;
global IDLE;

global next_event_type;
global num_custs_delayed;
global num_delays_required;
global num_events;
global num_in_q;
global server_status;

global area_num_in_q;
global area_server_status;
global mean_interarrival;
global mean_service;
global time;
global time_arrival;
global time_last_event;
global time_next_event;
global total_of_delays;
global delayinqueue;
global times_service;
global clients_server;
global client_in_server;
global client_departures;
global client_arrivals;

% Programa el proximo arrivo
arrive_exp = expon(mean_interarrival);
time_next_event(1) = time + arrive_exp;
client_arrivals = [client_arrivals time_next_event(1)];

% Chequea si el servidor esta ocupado 
if ( server_status(1) == BUSY && server_status(2) == BUSY )
	% Si ambos servidores estan ocupados: incrementa el numero de
	% clientes en la cola.
	 num_in_q = num_in_q + 1;

	 % Chequea si no se excede la cantidad de clientes en cola
	 if ( num_in_q > Q_LIMIT )
	 	% La cola alcanzo su limite, entonces para la simulacion
	 	fprintf(outfile, "\nOverflow de la cola a los %f minutos", time);
		return;
	end
	% Hay lugar en la cola, entonces almacena el tiempo de llegada del
	% cliente en arribo en el nuevo tiempo de arribo
		time_arrival(num_in_q) = time;
else
	% Un servidor esta libre! El nuevo cliente tiene un delay igual a cero
	delay            = 0.0;
	total_of_delays = total_of_delays + delay;
	% Incrementa el numero de clientes atendidos
	num_custs_delayed = num_custs_delayed + 1;
	delayinqueue(num_custs_delayed) = delay;

	% Si un servidor esta ocupado, entonces se lo doy al otro.
	if ( server_status(1) == BUSY )
		clients_server(num_custs_delayed) = 2;
		client_in_server(2) = num_custs_delayed;
		server_status(2) = BUSY;
	
		% Programa una partida (servicio completado)
		aux = expon(mean_service);
		time_next_event(3) = time + aux;
		client_departures(num_custs_delayed) = time_next_event(3);
	else
		clients_server(num_custs_delayed) = 1;
		client_in_server(1) = num_custs_delayed;
		server_status(1) = BUSY;
	
		% Programa una partida (servicio completado)
		aux = expon(mean_service);
		time_next_event(2) = time + aux;
		client_departures(num_custs_delayed) = time_next_event(2);
	end
	times_service(num_custs_delayed) = aux;
end
return;
